////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxncssensor.h
/// @brief CamX Sensor QSEE interface class definition
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXNCSSENSOR_H
#define CAMXNCSSENSOR_H

#include "camxncsintf.h"
#include "camxncssensordata.h"

CAMX_NAMESPACE_BEGIN

struct NCSDataIndex
{
    INT startIndex;  ///< Start index of the data
    INT endIndex;    ///< End index of the data
};

struct NCSSensorContext
{
    INCSIntfBase*   pNCSIntfObject;  ///< NCS interface object handle
    INT             suid;            ///< Sensor QSEE assigned SUID
    NCSSensorConfig config;          ///< NCS Sensor config data
    INT             connIndex;       ///< Connection index mapped to this client
    FLOAT           currSampleRate;  ///< Current sample rate
    UINT            curReportRate;   ///< Current report rate
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class implements the NCS sensor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// NOWHINE CP044: Need to set visibility, false positive
class NCSSensor
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// NCSSensor
    ///
    /// @brief  NCS Sensor object contructor
    ///
    /// @param  pNCSIntfObject NCS interface object
    /// @param  pConfig        sensor config data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC NCSSensor(
        INCSIntfBase*    pNCSIntfObject,
        NCSSensorConfig* pConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetDataSync
    ///
    /// @brief  API to do a sync request of data between t1 and t2, if data is not available, returns NULL as of now
    ///
    /// @param  tStart start timestamp
    /// @param  tEnd   end timestamp
    ///
    /// @return Data accessor object
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC NCSSensorData* GetDataSync(
        UINT64 tStart,
        UINT64 tEnd);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetLastNSamples
    ///
    /// @brief  API to do fetch the last recent N samples
    ///
    /// @param  numOfSamples Number of samples requested for
    ///
    /// @return Data accessor object
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC NCSSensorData* GetLastNSamples(
        UINT numOfSamples);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetDataAsync
    ///
    /// @brief  API to request async manner the data between two timestamps
    ///
    /// @param  tStart Start timestamp
    /// @param  tEnd   End timestamp
    /// @param  pFence Fence
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC CamxResult GetDataAsync(
        UINT64 tStart,
        UINT64 tEnd,
        VOID*  pFence);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetIntfHandle
    ///
    /// @brief  Get the parent NCS interface object
    ///
    /// @return the parent NCS interface object
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC INCSIntfBase* GetIntfHandle();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetSensorType
    ///
    /// @brief  Get the sensor type associated with this sensor handle
    ///
    /// @return the sensor type
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC NCSSensorType GetSensorType();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// FillSensorConfig
    ///
    /// @brief  Fills the sensor configuration into the passed pointer
    ///
    /// @param  pConfig Pointer to the config to be filled
    ///
    /// @return CamxResultSuccess of successful execution
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC CamxResult FillSensorConfig(
        NCSSensorConfig* pConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// PutBackDataObj
    ///
    /// @brief  Put back the sendor data accessor object
    ///
    /// @param  pNCSDataObject SensorData accessor object
    ///
    /// @return CamxResultSuccess of successful execution
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC CamxResult PutBackDataObj(
        NCSSensorData* pNCSDataObject);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SetConnIndex
    ///
    /// @brief  Set the connection index mapped to this client object
    ///
    /// @param  connIndex Connection index
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC VOID SetConnIndex(
        INT connIndex);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetConnIndex
    ///
    /// @brief  Get the connection index mapped to this client object
    ///
    /// @return Connection index mapped to this client
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC INT GetConnIndex();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SetCurrentConfig
    ///
    /// @brief  Set the current config of the connection
    ///
    /// @param  pConfig Sensor config
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC VOID SetCurrentConfig(
        NCSSensorConfig* pConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetSampleRate
    ///
    /// @brief  Get the current sample rate of the mapped connection
    ///
    /// @return Mapped connection sample rate
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC FLOAT GetSampleRate();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetReportRate
    ///
    /// @brief  Get the current report rate of this connection
    ///
    /// @return Mapped connection report rate
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_VISIBILITY_PUBLIC UINT GetReportRate();

private:
    // NC008: exception
    NCSSensorContext m_NCSSensorContext; ///< Member variable holding the sensor handle context

    // Disable copy constructor and assignment operator
    NCSSensor(const NCSSensor&)            = delete;
    NCSSensor& operator=(const NCSSensor&) = delete;
};

CAMX_NAMESPACE_END

#endif // CAMXNCSSENSOR_H
